// 用户代码段，这个段中的所有内容将被拷贝到生成的词法类的类声明之前。
import exceptions.*;

%%
// 参数设置和声明段

// 兼容 cup，等价于以下三条指令
%cup
// %implements java_cup.runtime.Scanner
// %function next_token
// %type java_cup.runtime.Symbol

// 使生成的类是 public 的
%public 
// 告诉 JFlex 生成的类的命名
%class OberonScanner 
// 定义扫描仪将处理的字符集，文本文件使用 unicode 即可
%unicode
// 忽略大小写
%ignorecase
// 打开行计数（当前行号可以通过变量 yyline 访问）
%line 
// 打开列计数（当前列号可以通过变量 yycolumn 访问）
%column
// 列出的异常将在扫描方法的 throws 子句中声明
%yylexthrow LexicalException
// 指定在文件末尾（EOF）时返回的特殊标记的指令
%eofval{
  return new java_cup.runtime.Symbol(OberonSymbol.EOF);
%eofval}

// 匹配数字
DIGIT = [0-9]
INTEGER = {DIGIT}+
// 匹配加号
PLUS = "+"

%%
// 词法分析段

<YYINITIAL>{ // 全局规则
    {INTEGER}   { return new java_cup.runtime.Symbol(OberonSymbol.INTEGER, yytext()); }
    {PLUS}      { return new java_cup.runtime.Symbol(OberonSymbol.PLUS); }
    .           { throw new LexicalException("词法错误：" + yytext()); }
}